-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_03.ex
46 lines (41 loc) · 1.17 KB
/
day_03.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
defmodule AdventOfCode.Day03 do
def part1(args) do
args
|> String.split()
|> Enum.map(&splitInHalf/1)
|> Enum.map(&findDuplicate/1)
|> Enum.map(&convertToPriority/1)
|> Enum.sum()
end
def splitInHalf(str), do: String.split_at(str, div(String.length(str), 2))
def findDuplicate({str1, str2}),
do:
MapSet.intersection(
MapSet.new(String.codepoints(str1)),
MapSet.new(String.codepoints(str2))
)
|> MapSet.to_list()
|> hd()
def findCommon([str1, str2, str3]),
do:
MapSet.intersection(
MapSet.new(String.codepoints(str1)),
MapSet.intersection(
MapSet.new(String.codepoints(str2)),
MapSet.new(String.codepoints(str3))
)
)
|> MapSet.to_list()
|> hd()
def convertToPriority(<<c::utf8, _::binary>>) when c <= ?z and c >= ?a, do: c - ?a + 1
def convertToPriority(<<c::utf8, _::binary>>) when c <= ?Z and c >= ?A, do: c - ?A + 27
def convertToPriority(_), do: :error
def part2(args) do
args
|> String.split()
|> Stream.chunk_every(3)
|> Enum.map(&findCommon/1)
|> Enum.map(&convertToPriority/1)
|> Enum.sum()
end
end